package JJJJJJava;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.hive.HiveContext;

/**
 * row_number()开窗函数实战
 * @Auther: Mengkunxuan
 * @Date:2018/10/816:11
 * @Description:
 */

public class RowNumberWindowsFunction {
    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("RowNumberwindowFuntion").setMaster("local");
        JavaSparkContext sc =new JavaSparkContext(conf);
        HiveContext hiveContext = new HiveContext(sc.sc());

        //创建销售额表,sales表
        hiveContext.sql("drop table if exits sales");
        hiveContext.sql("create table if not exists sales ("
        +"product string," +
                "category string," +
                "revenue bigint)");
        hiveContext.sql("load data" +
                "local inpath '/usr/local/spark-study/resoutces/sales.txt' "+
        " into table sales");

        //开始编写我们的统计逻辑,使用row_number()开窗函数
        //先说明一下,row_number()开窗函数的作用
        //其实,就是给每个分组的数据,按照其排序顺序,打上一个分组内的行号
        //比如说,有一个分组date = 2015001,里边有3调数据,1122,1121,1124
        //那么对这个分组的每一行使用row_number()开窗函数以后,三行,依次会获得一个组内的行号
        //行号从1开始递增,比如1122 1,1121 2, 1124 3

        DataFrame top3SalesDF=hiveContext.sql(""+"select product,category,revenue "+
                    "from ("+
                    "select " +
                "product," +
                "category" +
                "revenue," +
                //row_number()开窗函数的语句说明
                //首先,row_number()函数后面先跟上over关键字
                //然后括号中,是partition by,也就是说根据那个字段进行分组
                //其次是可以用order by进行组内排序
                //然后row_number()就可以给每个组内的行,一个组内行号
                "row_number() over(partition by category order by revenue desc) rank "+
                "from sales " +
                ") tmp_sales "+
                "where rank<=3"
        );
    //将每组排名前3的数据,保存到一个表中
        hiveContext.sql("drop table if exists top3_sales");
        top3SalesDF.saveAsTable("top3_sales");
        sc.close();
    }
}
